/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package org.wooxes.server;

import org.wooxes.client.Comment;

import org.jdom.*;
import org.jdom.input.*;
import org.jdom.output.*;

import java.io.*;
import java.net.*;
import java.sql.*;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

/**
 *
 * @author woox
 */
public class ArxiuXML {
    protected File file;
    
    public ArxiuXML(File file){
        this.file = file;
    }

    public boolean addComment(Comment comment){
        if ( !file.exists() ){
            // Si no existeix, es crea l'arxiu, i s'insereix el comentari
            return appendComment(new CommentXML(comment));
        }
        else{
            Vector vc = this.getComments();
            
            boolean existeix = false;
            Comment aux = null;
            int posicio=0;
            
            // Es comprova si ja existeix un comentari a la mateixa linia
            for (int i=0; i<vc.size(); i++){
                aux = (Comment) vc.get(i);
                if( aux.getLinia() == comment.getLinia()){
                    existeix = true;
                    posicio = 2*i + 1;
                }
            }
            
            if (!existeix){
                aux = null;
                Comment auxvell;
                int multiplicador=1;
                int i=0;
                for (i=0; i<=vc.size(); i++){
                    if( i == 0){
                        aux = (Comment) vc.get(i);
                        if ( comment.getLinia() < aux.getLinia()){
                            // Afegir a l'inici
                            multiplicador = 1;
                            break;
                        }
                    }
                    else if(i == vc.size()){
                        multiplicador = 2;
                        break;
                    }
                    else{
                        auxvell = aux;
                        aux = (Comment) vc.get(i);
                        if( (auxvell.getLinia() < comment.getLinia()) &&
                            (comment.getLinia() <= aux.getLinia()) ){
                            // Afegir entre "auxvell" i "aux"
                            multiplicador = 2;
                            break;
                        }
                    }
                }
                posicio = i * multiplicador;
            }
            
            SAXBuilder builder = new SAXBuilder();
            try{
                Document doc = builder.build(file);
                Element root = doc.getRootElement();

                if( existeix ){
                    root.setContent(posicio, new CommentXML(comment));
                }
                else{
                    root.addContent(posicio,new CommentXML(comment));
                }
                if(escriureXML(doc,file)){
                    return true;
                }
            }
            catch(Exception e){
                System.out.println("Exepcio afegint fill "+ e.toString());
            }
        }
        return false;
    }
    
    public boolean appendComment(CommentXML comment){
        if ( !file.exists() ){
            // Si no existeix, es crea l'arxiu, i s'insereix el comentari
            //if (crearXML(file, comment)){
            //    return true;
            //}
            return crearXML(file, comment);
        }
        else{
            // Si ja existeix, s'insereix al final de l'arxiu
            
            // Falta mirar si els comentaris repeteixen linies
            SAXBuilder builder = new SAXBuilder();
            try{
                Document doc = builder.build(file);
                Element root = doc.getRootElement();
                root.addContent(comment);

                if(escriureXML(doc,file)){
                    return true;
                }
            }
            catch(Exception e){
            }
        }
        return false;
    }
    
    public Vector getComments(){
        Vector vc = new Vector();
        if(!file.exists()){
            return vc;
        }
        SAXBuilder builder = new SAXBuilder();
        try{
            Document doc = builder.build(file);
            Element root = doc.getRootElement();
            List comentaris = root.getChildren("comment");
            Iterator i = comentaris.iterator();
            while( i.hasNext() ){
                Element e = (Element) i.next();
                String s1 = e.getChild("linia").getText();
                int i1 = Integer.parseInt(s1);
                String s2 = e.getChild("html").getText();
                String s3 = e.getChild("tipus").getText();
                vc.add(new Comment(i1, s2, s3));
            }
            
        }
        catch(Exception e){
            System.out.println(e);
        }
        return vc;
    }
    
    protected boolean crearXML(File arxiu, Element element){
        // Element arrel
        Element root = new Element("gwt");
        root.setAttribute("arxiu", arxiu.toString());
        
        root.addContent(element);
        Document doc = new Document(root);
        
        return escriureXML(doc,arxiu);
    }

    protected boolean escriureXML(Document doc, File arxiu){    
        try{
          XMLOutputter out=new XMLOutputter(Format.getPrettyFormat());
          FileOutputStream fileos=new FileOutputStream(arxiu);
          out.output(doc,fileos);
          fileos.flush();
          fileos.close();
        }
        catch(Exception e){
           System.out.println(e);
           return false;
        }
        return true;
    }
    
    public boolean eliminarComentari(int linia_e){
        SAXBuilder build = new SAXBuilder();
        try {
            Document doc = build.build(file);
            Element arrel = doc.getRootElement();
            
            List comments = arrel.getChildren("comment");
            Iterator iter = comments.iterator();
            
            while(iter.hasNext()){
                Element comment = (Element) iter.next();
                if (Integer.parseInt(comment.getChild("linia").getText()) == linia_e){
                    iter.remove();
                }
            }
            if(!escriureXML(doc, file)){
                System.out.println("Error al escriure arxiu");
                return false;
            }
            return true;
        }
        catch(Exception e){
            System.out.println("No s'ha pogut eliminar la línia");
            return false;
        }
    }

}
